/*
 * soc.h
 *
 * 简单 SOC（State of Charge）算法接口：库仑计数 + OCV 查表校正
 * 假设：默认针对单节锂离子电池（OCV 约 3.0V - 4.20V）。
 * 约定：current_mA 为正表示放电（电池输出电流），负表示充电。
 */

#ifndef __SOC_H_
#define __SOC_H_

#include <stdint.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

/* 初始化 SOC 模块
 * capacity_mAh: 电池标称容量，单位 mAh
 * initial_soc_percent: 初始 SOC（0..100）
 */
void SOC_Init(float capacity_mAh, float initial_soc_percent);

/* 每次测量后调用以更新 SOC
 * voltage_mV: 电池端电压，单位 mV
 * current_mA: 电流，单位 mA（>0 放电，<0 充电）
 * dt_s: 本次间隔时间，单位秒
 */
void SOC_Update(float voltage_mV, float current_mA, float dt_s);

/* 读取当前 SOC（百分比 0..100） */
float SOC_GetPercent(void);

/* 设置电池容量（mAh） */
void SOC_SetCapacity(float capacity_mAh);

/* 可选：设置自定义 OCV 表（电压与对应的 SOC%）。表需按电压升序排列。
 * volt_table_mV: 电压数组（mV）
 * soc_table_pct: 对应的 SOC 百分比数组（0..100）
 * len: 表长度
 */
int SOC_SetOCVTable(const uint16_t *volt_table_mV, const uint8_t *soc_table_pct, size_t len);

#ifdef __cplusplus
}
#endif

#endif /* __SOC_H_ */
